package thread.safety02;

/**
 * 同步代码块
 * 1.通过代码块中的锁对象（对象监视器、同步锁），可以使用任意对象
 * 2.但是必须保证多个线程使用的是同一个锁对象
 * 3.锁对象的作用：
 *          把同步代码块锁住，只让一个线程在同步代码块中执行
 *  遇到synchronized代码块 会先检查有没有锁对象 有则获取锁 执行同步代码块内的代码 执行完毕就释放锁
 */
public class RunnableImpl implements Runnable{

    private int ticket = 100;
    //创建一个锁对象
    Object object = new Object();
    @Override
    public void run() {
        //while死循环在同步代码块外，如果循环在内，则线程不会释放锁
        //synchronized (object) {
            while (true) {
                synchronized(object){
                if (ticket > 0) {
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");
                    ticket--;
                } else {
                    break;
                }
                 }
            }
       // }
    }
}
